package com.example.cms.until;

import com.alibaba.fastjson.JSON;

import com.example.cms.contants.BaseContants;
import com.example.cms.exception.BusinessException;

import net.sf.jxls.transformer.XLSTransformer;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @ClassName ExcelUitl
 * @Descriptiom
 * @Author sunbird
 * @Date 2018/11/21 10:07
 * @Version 1.0
 **/
public class ExcelUitl {

    /**
     * @Author Sunbird
     * @Description 文件导出为excel模板
     * @Date  2018/11/21
     * @Param
     * @return
     **/
    public static String exTemplateExcel(List<?> list ,String fileName) throws  Exception{
        Map<String ,Object> banParams =new HashMap<String, Object>();
        banParams.put("list",list);//模板数据
        String webappRoot =System.getProperty(BaseContants.WEBAPP_ROOT);
        String destPath =webappRoot+"files"+ File.separator+"temp"+File.separator+fileName;//创建临时存放文件
        File destFile =new File(destPath);//导出文件
        if (!destFile.getParentFile().exists()){
            destFile.getParentFile().mkdirs();//创建文件
        }
        String templatePath =webappRoot+"files"+File.separator+"xslExportTemplate"+File.separator+fileName;//导出模板路径
        XLSTransformer transformer =new XLSTransformer();
        //导出为excel文件
        transformer.transformXLS(templatePath,banParams,destPath);
        return destPath;
    }
    /**
     * @Author Sunbird
     * @Description 解析文件上传的//TODO
     * @Date  2018/11/21
     * @Param
     * @return
     **/

    public static  List<Map<String,Object>> getExcelData(MultipartFile[] files ) throws  Exception{
        if (files==null|| files.length==0){
            throw  new BusinessException("请上传文件");
        }
        List<Map<String ,Object>> maps =new ArrayList<Map<String, Object>>();

        //验证文件
        MultipartFile file =files[0];
        if(!"application/vnd.ms-excel".equals(file.getContentType()) && !"application/octet-stream".equals(file.getContentType())){
            throw new BusinessException("请选择正确的文件格式-excel");
        }
        Workbook workbook =new HSSFWorkbook(file.getInputStream());//创建excel文件对象
        Sheet sheet =workbook.getSheetAt(0);//获取工作薄对象
        Row rowFileName =sheet.getRow(2);//获取第三行，字段行
        Map<Integer,String >mapField =new HashMap<Integer, String>();//存储字段系列
        try {
            for (int i = 0; i <rowFileName.getLastCellNum(); i++) {
                if (rowFileName.getCell(i) != null) {
                    mapField.put(i, rowFileName.getCell(i).getStringCellValue());//获取单元格中的值
                }else {
                    throw new BusinessException("表格没有数据");
                }
            }
        }catch (Exception e){
            throw new BusinessException("excel头部解析异常");
        }
        //循环数据，每一行
        for (int i=4;i<sheet.getLastRowNum();i++){
            //循环数据,没一列
            Row row =sheet.getRow(i);//获取单元格的行
            if (row!=null){//如果行不为空
                Map<String,Object> map =new HashMap<String, Object>();
                for (int j=0;j<=row.getLastCellNum();j++){//循环每一行中的单元格
                    try {
                        if (row.getCell(j) != null) {//如果单元格不为空
                            map.put(mapField.get(j), getValue(row.getCell(j)));//设置字段的名,字段的值到map
                        }
                    }catch (Exception e){
                        throw  new BusinessException("第"+(i+1)+"行,第"+(j+1)+"列,数据解析异常");
                    }
                }
                maps.add(map);
            }
        }
        System.out.println("解析的excel 数据："+ JSON.toJSONString(maps));
        return maps;
    }
    /**
     * @param cell
     * @return
     * @Description 获取excel单元格内容, 将其转换为String类型
     * @author Enzo
     * @date 2016-1-21
     */
    private static String getValue(Cell cell)throws Exception {
        String value = "";
        if (null == cell) {
            return value;
        }
        switch (cell.getCellType()) {
            // 数值型
            case Cell.CELL_TYPE_NUMERIC:
                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                    // 如果是date类型则 ，获取该cell的date值
                    Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                    value = format.format(date);
                } else {// 纯数字
                    BigDecimal big = new BigDecimal(cell.getNumericCellValue());
                    value = big.toString();
                    if (null != value && !"".equals(value.trim())) {
                        String[] item = value.split("[.]");
                        if (1 < item.length && item[1].trim().length() > 3) {// 如果小数点后面大于三位，则保留三位小数
                            value = item[0] + "." + item[1].trim().substring(0, 3);
                        }
                    }
                }
                break;
            // 字符串类型
            case Cell.CELL_TYPE_STRING:
                value = cell.getStringCellValue().toString();
                break;
            // 公式类型
            case Cell.CELL_TYPE_FORMULA:
                // 读公式计算值
                value = String.valueOf(cell.getNumericCellValue());
                if (value.equals("NaN")) {// 如果获取的数据值为非法值,则转换为获取字符串
                    value = cell.getStringCellValue().toString();
                }
                break;
            // 布尔类型
            case Cell.CELL_TYPE_BOOLEAN:
                value = " " + cell.getBooleanCellValue();
                break;
            // 空值
            case Cell.CELL_TYPE_BLANK:
                value = "";
                // LogUtil.getLogger().error("excel出现空值");
                break;
            // 故障
            case Cell.CELL_TYPE_ERROR:
                value = "";
                // LogUtil.getLogger().error("excel出现故障");
                break;
            default:
                value = cell.getStringCellValue().toString();
        }
        if ("null".endsWith(value.trim())) {
            value = "";
        }
        return value;
    }


}
